// src/main/auth.js
const crypto = require('crypto');
const path = require('path');
const fs = require('fs');
const { app } = require('electron');

class MemoryAuthManager {
  constructor() {
    // 使用 app.getPath('userData') 获取应用的用户数据目录
    // 开发环境使用 __dirname/../data，生产环境使用应用用户数据目录
    let dataDir;
    if (process.env.NODE_ENV === 'development') {
      dataDir = path.join(__dirname, '../data');
    } else {
      dataDir = path.join(app.getPath('userData'), 'data');
    }
    
    this.dbPath = path.join(dataDir, 'system.db');
    this.configPath = path.join(dataDir, 'auth.config');
    this.ensureDataDir();
    
    this.sessions = new Map();
    this.userSessions = new Map();
  }

  ensureDataDir() {
    const dataDir = path.dirname(this.dbPath);
    if (!fs.existsSync(dataDir)) {
      fs.mkdirSync(dataDir, { recursive: true });
    }
  }

  // 关键修复：使用固定的盐值生成密钥
  generateDbKey(username, password) {
    // 使用固定的盐值，确保每次生成的密钥相同
    const fixedSalt = '纪检监察系统固定盐值2024';
    return crypto
      .createHash('sha256')
      .update(username + password + fixedSalt)
      .digest('hex')
      .substring(0, 32);
  }

  // 生成会话ID
  generateSessionId() {
    return crypto.randomBytes(32).toString('hex');
  }

  // 检查是否是第一次运行
  async isFirstRun() {
    return !fs.existsSync(this.configPath);
  }

    // 首次设置
  async firstTimeSetup(username, password) {
    if (!username || !password) {
      throw new Error('用户名和密码不能为空');
    }

    if (password.length < 6) {
      throw new Error('密码长度至少6位');
    }

    console.log('=== 首次设置开始 ===');
    
    // 生成盐值
    const salt = crypto.randomBytes(16).toString('hex');
    
    // 生成密码哈希（使用盐值）
    const passwordHash = crypto.createHash('sha256')
      .update(password + salt)
      .digest('hex');

    // 生成数据库密钥
    const dbKey = this.generateDbKey(username, password);
    console.log('生成的数据库密钥长度:', dbKey.length);
    console.log('密钥前10位:', dbKey.substring(0, 10) + '...');

    // 创建配置
    const config = {
      username: username,
      passwordHash: passwordHash, // 使用带盐值的哈希
      salt: salt, // 保存盐值用于验证
      dbKeySalt: 'fixed-salt-2024',
      createdAt: new Date().toISOString(),
      version: '1.0.0'
    };

    // 保存配置
    fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf8');
    console.log('配置文件已保存:', this.configPath);
    
    // 初始化数据库（使用密钥）
    await this.initDatabase(dbKey);

    // 创建会话
    const sessionId = this.generateSessionId();
    const session = {
      dbKey: dbKey,
      username: username,
      expiry: Date.now() + (24 * 60 * 60 * 1000),
      loginTime: new Date().toISOString()
    };
    
    this.sessions.set(sessionId, session);
    this.userSessions.set(username, sessionId);

    console.log('首次设置完成，会话已创建');
    console.log('=== 首次设置结束 ===');

    return { 
      success: true, 
      message: '系统初始化成功',
      sessionId: sessionId
    };
  }

  // 用户登录
  async login(username, password) {
    console.log('=== 登录开始 ===');
    console.log('输入的用户名:', username);
    
    if (!fs.existsSync(this.configPath)) {
      throw new Error('系统未初始化，请先进行首次设置');
    }

    // 读取配置
    const config = JSON.parse(fs.readFileSync(this.configPath, 'utf8'));
    console.log('配置中的用户名:', config.username);
    console.log('配置中的盐值:', config.salt);
    
    // 验证用户名
    if (username !== config.username) {
      console.log('用户名不匹配');
      throw new Error('用户名或密码错误');
    }

    // 验证密码哈希（使用相同的盐值）
    const inputHash = crypto.createHash('sha256')
      .update(password + config.salt) // 使用配置中保存的盐值
      .digest('hex');
    
    console.log('输入密码哈希:', inputHash);
    console.log('配置密码哈希:', config.passwordHash);
    console.log('密码哈希验证:', inputHash === config.passwordHash);
    
    if (inputHash !== config.passwordHash) {
      console.log('密码哈希不匹配');
      throw new Error('用户名或密码错误');
    }

    // 生成数据库密钥
    const dbKey = this.generateDbKey(username, password);
    console.log('登录时生成的数据库密钥长度:', dbKey.length);
    console.log('密钥前10位:', dbKey.substring(0, 10) + '...');
    await this.initDatabase(dbKey);


    // 验证数据库连接
    try {
      await this.verifyDatabase(dbKey);
      console.log('数据库验证成功');
    } catch (error) {
      console.error('数据库验证失败:', error.message);
      throw new Error('数据库验证失败: ' + error.message);
    }

    // 创建会话
    const sessionId = this.generateSessionId();
    const session = {
      dbKey: dbKey,
      username: username,
      expiry: Date.now() + (24 * 60 * 60 * 1000),
      loginTime: new Date().toISOString()
    };
    
    this.sessions.set(sessionId, session);
    this.userSessions.set(username, sessionId);

    console.log('登录成功，会话已创建');
    console.log('=== 登录结束 ===');

    return { 
      success: true, 
      message: '登录成功',
      sessionId: sessionId
    };
  }

  // 初始化数据库
  async initDatabase(dbKey) {
    const Database = require('better-sqlite3');
    
    const options = {};
    if (dbKey) {
      options.key = dbKey;
    }
    
    console.log('初始化数据库，使用密钥:', !!dbKey);
    
    const db = new Database(this.dbPath, options);
    
    // 创建用户表
    db.exec(`
      CREATE TABLE IF NOT EXISTS users (
        id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
        username TEXT UNIQUE NOT NULL,
        password_hash TEXT ,
        role TEXT DEFAULT 'user',
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        last_login DATETIME,
        unit_code TEXT,
        unit_name TEXT,
        unit_prefix TEXT,
        unit_belong TEXT,
        backup TEXT
      )
    `);

    // 创建案件表
    db.exec(`
      CREATE TABLE IF NOT EXISTS cases (
        id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
        case_number TEXT UNIQUE NOT NULL,
        case_name TEXT NOT NULL,
        status TEXT DEFAULT 'pending',
        created_by TEXT,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
      )
    `);
    
    // 创建下属单位信息表
    db.exec(`
      CREATE TABLE IF NOT EXISTS subUnits (
        id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
        code TEXT UNIQUE NOT NULL,
        name TEXT NOT NULL,
        status TEXT DEFAULT '启用',
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        created_by TEXT,
        updated_by TEXT
      )
    `);

    // 创建领导人员个人基本信息表
    db.exec(`
      CREATE TABLE IF NOT EXISTS leader_personnel_infro (
        id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
        personnel_code TEXT UNIQUE NOT NULL,          -- 人员编码
        unit_name TEXT NOT NULL,                      -- 单位名称
        department_name TEXT,                         -- 部门名称
        name TEXT NOT NULL,                           -- 姓名
        gender TEXT,                                  -- 性别
        birth_date DATE,                              -- 出生日期
        nationality TEXT,                             -- 民族
        native_place TEXT,                            -- 籍贯
        birth_place TEXT,                             -- 出生地
        work_start_date DATE,                         -- 参加工作日期
        health_status TEXT,                           -- 健康状况
        appointment_title TEXT,                       -- 聘任职称
        education_level TEXT,                         -- 学历
        graduate_school TEXT,                         -- 毕业学校
        major_studied TEXT,                           -- 所学专业
        study_type TEXT,                              -- 学习类型
        current_position TEXT,                        -- 现任行政职务
        position_level TEXT,                          -- 职务级别
        graduation_date DATE,                         -- 毕业日期
        political_status TEXT,                        -- 政治面貌
        id_card_number TEXT UNIQUE NOT NULL,          -- 身份证号
        resume TEXT,                                  -- 个人履历
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        created_by TEXT,
        updated_by TEXT
      )
    `);
    // 创建导出配置管理表
    db.exec(`
      CREATE TABLE IF NOT EXISTS export (
        export_id text PRIMARY KEY,
        export_name TEXT NOT NULL,
        units TEXT
        )
    `);
     db.exec(`
      CREATE TABLE IF NOT EXISTS export_subtable (
        id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
        export_id TEXT,
        table_name TEXT,
        columns TEXT
      )
    `);

    // 创建新提拔领导人员个人有关事项报告表
    db.exec(`
      CREATE TABLE IF NOT EXISTS new_leader_report (
        id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
        report_name TEXT NOT NULL,                    -- 报告人姓名
        unit TEXT NOT NULL,                           -- 单位
        position TEXT NOT NULL,                       -- 职务
        gender TEXT,                                  -- 性别
        phone_number TEXT,                            -- 手机号码
        id_number TEXT UNIQUE NOT NULL,               -- 身份证号（唯一键）
        political_status TEXT,                        -- 政治面貌
        serious_illness TEXT,                         -- 本人是否身患重大疾病
        marital_status TEXT,                          -- 婚姻情况
        registered_address TEXT,                      -- 户籍地具体地址
        
        -- 简化后的长描述字段
        passport_and_permits_info TEXT,               -- 本人取得普通护照、往来港澳通行证等情况
        overseas_social_media_info TEXT,              -- 本人因私设立使用国（境）外社交媒体账号情况
        children_international_marriage_info TEXT,    -- 子女与外国人、无国籍人、港澳台居民通婚的情况
        family_overseas_residency_info TEXT,          -- 配偶子女移居国（境）外等情况
        family_business_positions_info TEXT,          -- 配偶子女及其配偶受聘担任私营企业高级职务等情况
        legal_and_disciplinary_actions TEXT,          -- 本人配偶子女及其配偶被司法机关追究刑事责任等情况
        investigation_and_interrogation_info TEXT,    -- 本人涉嫌违规违纪违法犯罪问题等情况
        dishonest_person_status TEXT,                 -- 本人或者配偶列为失信被执行人的情况
        
        -- JSON格式存储的复杂信息
        relatives_basicInfro TEXT,                    -- 亲属基本信息（JSON格式）
        relatives_houseInfro TEXT,                    -- 房产情况信息（JSON格式）
        relatives_workin_railway TEXT,                -- 在铁路系统工作情况（JSON格式）
        other_matters TEXT,                          -- 其他需要报告的事项
        
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        created_by TEXT,
        updated_by TEXT
      )
    `);

    // 创建问题线索表
    db.exec(`
  CREATE TABLE IF NOT EXISTS problem_clues_situation (
    id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
    -- 基本信息
    main_mark TEXT,                          -- 主件标识
    is_unit TEXT,                            -- 是否单位
    report_unit_name TEXT,                   -- 填报单位名称
    report_unit_code TEXT,                   -- 填报单位代码
    reflected_person TEXT,                   -- 被反映人
    work_unit_and_position TEXT,             -- 工作单位及职务
    rank TEXT,                               -- 职级
    handling_agency TEXT,                    -- 办理机关
    main_problem_clue TEXT,                  -- 主要问题线索
    petition_code TEXT,                      -- 信访编码
    
    -- 受理信息
    accept_clue_code TEXT UNIQUE NOT NULL,   -- 受理线索编码(唯一键)
    accept_person_code TEXT,                 -- 受理人员编码(和领导人员个人基本信息表(leader_personnel_infro)中的人员编码(personnel_code)关联)
    disposal_clue_code TEXT,                 -- 处置线索编码
    disposal_person_code TEXT,               -- 处置人员编码
    
    -- 对象信息
    is_national_supervision_object TEXT,     -- 是否国家监察对象
    recover_economic_loss REAL,              -- 挽回经济损失（万元）
    recovery_amount REAL,                    -- 收缴金额（万元）
    confiscation_amount REAL,                -- 没收金额
    order_refund_amount REAL,                -- 责令退赔金额
    register_submit_amount REAL,             -- 登记上交金额
    recover_loss_due_to_misconduct REAL,     -- 追缴失职渎职滥用职权造成的损失金额
    remarks TEXT,                            -- 备注
    
    -- 个人信息
    ethnicity TEXT,                          -- 民族
    birth_date TEXT,                         -- 出生年月
    npc_member TEXT,                         -- 人大代表
    cppcc_member TEXT,                       -- 政协委员
    is_discipline_inspection_official TEXT,  -- 是否纪检监察干部
    disposal_report TEXT,                    -- 处置情况报告
    party_join_date TEXT,                    -- 入党时间
    cadre_management_authority TEXT,         -- 干部管理权限
    central_managed_cadre_level2 TEXT,       -- 中管干部二级
    impact_end_date TEXT,                    -- 影响期限结束时间

  
    -- 时间信息
    accept_time TEXT,                        -- 受理时间
    accept_stat_time TEXT,                   -- 受理统计时间
    
    -- 处置方式（最多8种处置方式）
    disposal_method1_approval_time TEXT,     -- 处置方式1批准时间
    disposal_method1_stat_time TEXT,         -- 处置方式1统计时间
    disposal_method1_level1 TEXT,            -- 处置方式1一级
    disposal_method1_level2 TEXT,            -- 处置方式1二级
    
    disposal_method2_approval_time TEXT,     -- 处置方式2批准时间
    disposal_method2_stat_time TEXT,         -- 处置方式2统计时间
    disposal_method2_level1 TEXT,            -- 处置方式2一级
    disposal_method2_level2 TEXT,            -- 处置方式2二级
    
    disposal_method3_approval_time TEXT,     -- 处置方式3批准时间
    disposal_method3_stat_time TEXT,         -- 处置方式3统计时间
    disposal_method3_level1 TEXT,            -- 处置方式3一级
    disposal_method3_level2 TEXT,            -- 处置方式3二级
    
    disposal_method4_approval_time TEXT,     -- 处置方式4批准时间
    disposal_method4_stat_time TEXT,         -- 处置方式4统计时间
    disposal_method4_level1 TEXT,            -- 处置方式4一级
    disposal_method4_level2 TEXT,            -- 处置方式4二级
    
    disposal_method5_approval_time TEXT,     -- 处置方式5批准时间
    disposal_method5_stat_time TEXT,         -- 处置方式5统计时间
    disposal_method5_level1 TEXT,            -- 处置方式5一级
    disposal_method5_level2 TEXT,            -- 处置方式5二级
    
    disposal_method6_approval_time TEXT,     -- 处置方式6批准时间
    disposal_method6_stat_time TEXT,         -- 处置方式6统计时间
    disposal_method6_level1 TEXT,            -- 处置方式6一级
    disposal_method6_level2 TEXT,            -- 处置方式6二级
    
    disposal_method7_approval_time TEXT,     -- 处置方式7批准时间
    disposal_method7_stat_time TEXT,         -- 处置方式7统计时间
    disposal_method7_level1 TEXT,            -- 处置方式7一级
    disposal_method7_level2 TEXT,            -- 处置方式7二级
    
    disposal_method8_approval_time TEXT,     -- 处置方式8批准时间
    disposal_method8_stat_time TEXT,         -- 处置方式8统计时间
    disposal_method8_level1 TEXT,            -- 处置方式8一级
    disposal_method8_level2 TEXT,            -- 处置方式8二级
    
    -- 线索来源
    clue_source TEXT,                        -- 线索来源
    inspection_found_level2 TEXT,            -- 巡视巡察中发现二级分类
    superior_assigned_level2 TEXT,           -- 上级交办转办二级分类
    is_verified_with_person TEXT,            -- 是否与本人核实
    is_voluntary_confession TEXT,            -- 是否主动交代问题
    is_explained_in_meeting TEXT,            -- 是否在民主生活会上作说明
    
    -- 办理结果
    handling_result TEXT,                    -- 办理结果
    closing_time TEXT,                       -- 办结时间
    closing_stat_time TEXT,                  -- 办结统计时间
    
    -- 身份分类
    is_party_member TEXT,                    -- 是否党员
    supervision_object_level2 TEXT,          -- 监察对象二级分类
    is_non_party_non_supervision TEXT,       -- 是否非党员非监察对象
    non_party_non_supervision_level2 TEXT,   -- 非党员非监察对象二级分类
    
    -- 行为分类
    disciplinary_violation TEXT,             -- 违纪行为
    duty_illegal_crime TEXT,                 -- 职务违法犯罪行为
    other_illegal_crime TEXT,                -- 其他违法犯罪行为
    
    -- 组织措施
    organizational_measures TEXT,            -- 组织措施
    organizational_measures_stat_time TEXT,  -- 组织措施统计时间
    is_voluntary_surrender TEXT,             -- 是否主动投案
    is_report_to_superior TEXT,              -- 是否属于向上级报告范围
    
    -- 调查措施
    tech_investigation_measure_count INTEGER, -- 技术调查措施使用次数
    exit_restriction_measure_count INTEGER,  -- 限制出境措施使用次数
    tech_investigation_doc_number TEXT,      -- 技术调查措施文书编号
    exit_restriction_doc_number TEXT,        -- 限制出境措施文书编号
    measure_stat_time TEXT,                  -- 使用措施统计时间
    
    -- 办理环节
    transfer_to_handling TEXT,               -- 转入办理环节
    transfer_department_name TEXT,           -- 移交其他部门办理-部门名称
    
    -- 违纪违法行为时间
    violation_occurrence_time TEXT,          -- 违纪违法行为发生时间
    
    -- 纪检监察建议（最多8条建议）
    suggesting_agency1 TEXT,                 -- 提出建议的纪检监察机构名称1
    suggested_unit1 TEXT,                    -- 被建议的单位（组织）名称1
    suggestion_type1 TEXT,                   -- 建议类型1
    suggestion_content1 TEXT,                -- 建议文书内容1
    suggestion_time1 TEXT,                   -- 提出建议时间1
    suggestion_stat_time1 TEXT,              -- 提出建议统计时间1
    
    suggesting_agency2 TEXT,
    suggested_unit2 TEXT,
    suggestion_type2 TEXT,
    suggestion_content2 TEXT,
    suggestion_time2 TEXT,
    suggestion_stat_time2 TEXT,
    
    suggesting_agency3 TEXT,
    suggested_unit3 TEXT,
    suggestion_type3 TEXT,
    suggestion_content3 TEXT,
    suggestion_time3 TEXT,
    suggestion_stat_time3 TEXT,
    
    suggesting_agency4 TEXT,
    suggested_unit4 TEXT,
    suggestion_type4 TEXT,
    suggestion_content4 TEXT,
    suggestion_time4 TEXT,
    suggestion_stat_time4 TEXT,
    
    suggesting_agency5 TEXT,
    suggested_unit5 TEXT,
    suggestion_type5 TEXT,
    suggestion_content5 TEXT,
    suggestion_time5 TEXT,
    suggestion_stat_time5 TEXT,
    
    suggesting_agency6 TEXT,
    suggested_unit6 TEXT,
    suggestion_type6 TEXT,
    suggestion_content6 TEXT,
    suggestion_time6 TEXT,
    suggestion_stat_time6 TEXT,
    
    suggesting_agency7 TEXT,
    suggested_unit7 TEXT,
    suggestion_type7 TEXT,
    suggestion_content7 TEXT,
    suggestion_time7 TEXT,
    suggestion_stat_time7 TEXT,
    
    suggesting_agency8 TEXT,
    suggested_unit8 TEXT,
    suggestion_type8 TEXT,
    suggestion_content8 TEXT,
    suggestion_time8 TEXT,
    suggestion_stat_time8 TEXT,
    
    -- 时间统计
    handling_time TEXT,                      -- 办理时间
    handling_stat_time TEXT,                 -- 办理统计时间
    remarks_stat_time TEXT,                  -- 备注统计时间
    
    -- 涉外信息
    foreign_related_category TEXT,           -- 涉外类别
    involved_country TEXT,                   -- 涉及国家（地区）
    foreign_related_stat_time TEXT,          -- 涉外统计时间
    foreign_related_summary TEXT,            -- 涉外信息摘要
    
    -- 四种形态
    four_forms_situation TEXT,               -- 四种形态情形
    four_forms_stat_time TEXT,               -- 四种形态统计时间
    
    -- 系统字段
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    created_by TEXT,
    updated_by TEXT
  )
`);
  
  //创建受党纪处分和组织处理情况表
  db.exec(`
  CREATE TABLE IF NOT EXISTS discipline_organization_punishment (
    id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
    
    -- 基本信息
    report_unit_name TEXT,                    -- 填报单位名称
    report_unit_code TEXT,                    -- 填报单位代码
    investigated_person TEXT,                 -- 被调查人
    work_unit_and_position TEXT,              -- 工作单位及职务
    rank TEXT,                                -- 职级
    cadre_management_authority TEXT,          -- 干部管理权限
    central_managed_cadre_level2 TEXT,        -- 中管干部二级
    is_unit_or_accident TEXT,                 -- 是否单位或事故
    
    -- 案件信息
    case_code TEXT UNIQUE NOT NULL,           -- 案件编码（唯一键）
    involved_person_code TEXT,                -- 涉案人员编码(和领导人员个人基本信息表(leader_personnel_infro)中的人员编码(personnel_code)关联)
    
    -- 个人信息
    id_type TEXT,                             -- 证件类型
    id_number TEXT,                           -- 证件号码
    gender TEXT,                              -- 性别
    age INTEGER,                              -- 年龄
    birth_date TEXT,                          -- 出生年月
    education TEXT,                           -- 学历
    ethnicity TEXT,                           -- 民族
    is_national_supervision_object TEXT,      -- 是否国家监察对象
    national_supervision_object_detail TEXT,  -- 国家监察对象详情
    is_ccp_member TEXT,                       -- 是否中共党员
    ccp_congress_representative TEXT,         -- 中共党代表
    party_join_date TEXT,                     -- 入党时间
    non_party_non_supervision TEXT,           -- 非党员非监察对象
    non_party_non_supervision_detail TEXT,    -- 非党员非监察对象详情
    npc_member TEXT,                          -- 人大代表
    cppcc_member TEXT,                        -- 政协委员
    is_discipline_inspection_official TEXT,   -- 是否纪检监察干部
    discipline_inspection_committee TEXT,     -- 纪委委员
    party_committee TEXT,                     -- 党委委员
    current_position_start_date TEXT,         -- 任现职时间
    principal_violation TEXT,                 -- 一把手违纪违法
    principal_detail1 TEXT,                   -- 一把手细节
    principal_detail2 TEXT,                   -- 一把手细节2
    principal_rank TEXT,                      -- 正副职级
    department_category TEXT,                 -- 部门分类
    department_category1 TEXT,                -- 部门分类1
    enterprise_nature TEXT,                   -- 企业性质
    enterprise_nature1 TEXT,                  -- 企业性质1
    enterprise_personnel_category TEXT,       -- 企业人员类别
    enterprise_position TEXT,                 -- 企业岗位
    impact_end_date TEXT,                    -- 影响期限结束时间
    
    -- 金额信息
    misconduct_amount REAL,                   -- 失职渎职金额
    total_violation_amount REAL,              -- 违纪违法总金额（万元）
    
    -- 立案信息
    filing_stat_time TEXT,                    -- 立案统计时间
    filing_time TEXT,                         -- 立案时间
    case_source TEXT,                         -- 案件来源
    inspection_found_level2 TEXT,             -- 巡视巡察中发现二级分类
    superior_assigned_level2 TEXT,            -- 上级交办转办二级分类
    discipline_filing_agency TEXT,            -- 纪委立案机关
    discipline_filing_time TEXT,              -- 纪委立案时间
    discipline_filing_stat_time TEXT,         -- 纪委立案统计时间
    supervision_filing_agency TEXT,           -- 监委立案机关
    supervision_filing_time TEXT,             -- 监委立案时间
    supervision_filing_stat_time TEXT,        -- 监委立案统计时间
    is_transferred_after_filing TEXT,         -- 是否其他纪检监察机关立案后移送
    transfer_method TEXT,                     -- 立案后移送方式
    transfer_unit TEXT,                       -- 移送单位
    brief_case_description TEXT,              -- 简要案情
    filing_report TEXT,                       -- 立案报告
    filing_decision TEXT,                     -- 立案决定书
    remarks TEXT,                             -- 备注
    
    -- 特征信息
    is_violate_central_regulations TEXT,      -- 是否违反中央八项规定精神
    is_accountability_case TEXT,              -- 是否属于问责
    is_voluntary_confession TEXT,             -- 是否主动交代问题
    
    -- 结案信息
    closing_stat_time TEXT,                   -- 结案统计时间
    case_cancellation_time TEXT,              -- 销案时间
    closing_time TEXT,                        -- 结案时间
    
    -- 处分信息
    party_discipline_punishment TEXT,         -- 党纪处分
    is_should_dismiss_but_given_warning TEXT, -- 是否本应撤销党内职务但给予严重警告
    party_punishment_stat_time TEXT,          -- 党纪处分统计时间
    administrative_punishment TEXT,           -- 政务处分
    admin_punishment_stat_time TEXT,          -- 政务处分统计时间
    other_treatment TEXT,                     -- 其他处理
    other_treatment_stat_time TEXT,           -- 其他处理统计时间
    
    -- 司法处理
    transfer_prosecution_time TEXT,           -- 移送检察机关时间
    transfer_prosecution_stat_time TEXT,      -- 移送检察机关统计时间
    criminal_punishment_main TEXT,            -- 刑事处理主刑
    criminal_punishment_additional TEXT,      -- 刑事处理附加刑
    main_sentence_years INTEGER,              -- 主刑年数
    main_sentence_months INTEGER,             -- 主刑月数
    probation_years INTEGER,                  -- 缓刑年数
    probation_months INTEGER,                 -- 缓刑月数
    court_judgment_stat_time TEXT,            -- 审判机关判决统计时间
    
    -- 经济处理
    recover_economic_loss REAL,               -- 挽回经济损失（万元）
    recovery_amount REAL,                     -- 收缴金额（万元）
    confiscation_amount REAL,                 -- 没收金额
    order_refund_amount REAL,                 -- 责令退赔金额
    register_submit_amount REAL,              -- 登记上交金额
    recover_loss_due_to_misconduct REAL,      -- 追缴失职渎职滥用职权造成的损失金额
    
    -- 时间信息
    first_violation_time TEXT,                -- 首次违纪违法时间
    last_violation_time TEXT,                 -- 末次违纪违法时间
    other_violation_time TEXT,                -- 其他违纪违法时间
    escape_time TEXT,                         -- 潜逃时间
    escape_stat_time TEXT,                    -- 潜逃统计时间
    
    -- 审理信息
    trial_accept_time TEXT,                   -- 审理受理时间
    trial_accept_stat_time TEXT,              -- 审理受理统计时间
    trial_agency TEXT,                        -- 审理机关
    trial_completion_time TEXT,               -- 审结时间
    trial_completion_stat_time TEXT,          -- 审结统计时间
    punishment_decision TEXT,                 -- 处分决定
    court_judgment_time TEXT,                 -- 审判机关判决时间
    judicial_judgment_amount REAL,            -- 司法判决金额（万元）
    
    -- 报告文件
    investigation_report TEXT,                -- 审查调查报告
    trial_report TEXT,                        -- 审理报告
    case_analysis TEXT,                       -- 案件剖析
    
    -- 其他处分信息
    probation_period_years INTEGER,           -- 留党察看年限
    enterprise_level TEXT,                    -- 企业级别
    escape_destination TEXT,                  -- 潜逃去向
    escape_destination_detail TEXT,           -- 潜逃去向细节
    
    -- 调查信息
    investigation_suspension_time TEXT,       -- 调查中止时间
    investigation_suspension_stat_time TEXT,  -- 调查中止统计时间
    capture_time TEXT,                        -- 抓获时间
    capture_stat_time TEXT,                   -- 抓获统计时间
    case_analysis_report_stat_time TEXT,      -- 案件剖析报告统计时间
    
    -- 行为分类
    disciplinary_violation TEXT,              -- 违纪行为
    duty_illegal_crime TEXT,                  -- 职务违法犯罪行为
    other_illegal_crime TEXT,                 -- 其他违法犯罪行为
    
    -- 措施信息
    measure_agency TEXT,                      -- 采取措施机关
    measure_agency_name TEXT,                 -- 采取措施机关名称
    detention_start_time TEXT,                -- 留置起始时间
    detention_start_stat_time TEXT,           -- 留置起始统计时间
    measure_location TEXT,                    -- 采取措施地点
    measure_location_category TEXT,           -- 采取措施地点分类
    detention_decision TEXT,                  -- 留置决定书
    detention_end_time TEXT,                  -- 留置结束时间
    detention_end_stat_time TEXT,             -- 留置结束统计时间
    detention_days INTEGER,                   -- 留置天数
    is_extension TEXT,                        -- 是否延期
    extension_days INTEGER,                   -- 延期天数
    extended_detention_decision TEXT,         -- 延长留置时间决定书
    
    -- 特征分类
    is_masses_problem TEXT,                   -- 是否群众身边的不正之风和腐败问题
    
    -- 组织措施
    organizational_measures TEXT,             -- 组织措施
    organizational_measures_stat_time TEXT,   -- 组织措施统计时间
    
    -- 其他金额
    transfer_prosecution_amount REAL,         -- 移送检察机关金额（万元）
    
    -- 历史措施
    shuanggui_start_time TEXT,                -- 两规两指起始时间
    shuanggui_stat_time TEXT,                 -- 两规两指统计时间
    shuanggui_end_time TEXT,                  -- 两规两指解除时间
    shuanggui_end_stat_time TEXT,             -- 两规两指解除统计时间
    
    -- 忏悔材料
    confession TEXT,                          -- 忏悔书
    
    -- 投案信息
    is_voluntary_surrender TEXT,              -- 是否主动投案
    is_report_to_superior TEXT,               -- 是否属于向上级纪委监委报告范围
    
    -- 补充调查
    is_return_supplementary_investigation TEXT, -- 是否退回补充调查
    return_supplementary_time TEXT,           -- 退回补充调查时间
    return_supplementary_stat_time TEXT,      -- 退回补充调查统计时间
    return_supplementary_reason TEXT,         -- 退回补充调查原因
    is_second_return_supplementary TEXT,      -- 是否二次退回补充调查
    second_return_supplementary_time TEXT,    -- 二次退回补充调查时间
    second_return_supplementary_stat_time TEXT, -- 二次退回补充调查统计时间
    second_return_supplementary_reason TEXT,  -- 二次退回补充调查原因
    
    -- 不起诉信息
    is_no_prosecution TEXT,                   -- 是否不起诉
    no_prosecution_reason TEXT,               -- 不起诉原因
    no_prosecution_decision_time TEXT,        -- 决定不起诉时间
    no_prosecution_decision_stat_time TEXT,   -- 决定不起诉统计时间
    
    -- 司法信息
    court_judgment_crime TEXT,                -- 审判机关判决罪名
    public_security_punishment TEXT,          -- 公安等其他行政法机关处罚
    public_security_punishment_detail TEXT,   -- 公安等其他行政法机关处罚详细内容
    transfer_public_security_time TEXT,       -- 移送公安机关时间
    transfer_public_security_stat_time TEXT,  -- 移送公安机关统计时间
    public_security_punishment_time TEXT,     -- 公安等其他行政法机关处罚时间
    public_security_punishment_stat_time TEXT, -- 公安等其他行政法机关处罚统计时间
    
    -- 处分变更
    change_punishment_time TEXT,              -- 变更处分时间
    revoke_punishment_time TEXT,              -- 撤销处分时间
    change_punishment_stat_time TEXT,         -- 变更处分统计时间
    revoke_punishment_stat_time TEXT,         -- 撤销处分统计时间
    change_revoke_reason TEXT,                -- 变更撤销原因
    new_party_punishment TEXT,                -- 新党纪处分
    is_new_should_dismiss_but_warning TEXT,   -- 新党纪处分是否属于"本应撤销党内职务但给予严重警告"
    new_probation_period_years INTEGER,       -- 新留党察看年限
    new_administrative_punishment TEXT,       -- 新政务处分
    new_other_treatment TEXT,                 -- 新其他处理
    new_organizational_measures TEXT,         -- 新组织措施
    
    -- 从宽处罚建议
    is_leniency_suggestion TEXT,              -- 监察机关是否提出从宽处罚建议
    leniency_suggestion_type TEXT,            -- 从宽处罚建议类型
    leniency_suggestion_situation TEXT,       -- 监察机关提出从宽处罚建议的情形
    leniency_suggestion_stat_time TEXT,       -- 提出从宽处罚建议统计时间
    is_prosecution_adopt_leniency TEXT,       -- 检察机关是否采纳从宽处罚建议
    prosecution_adopt_leniency_time TEXT,     -- 检察机关采纳从宽处罚建议时间
    prosecution_adopt_leniency_stat_time TEXT, -- 检察机关采纳从宽处罚建议统计时间
    is_court_adopt_leniency TEXT,             -- 审判机关是否采纳从宽处罚建议
    court_adopt_leniency_time TEXT,           -- 审判机关采纳从宽处罚建议时间
    court_adopt_leniency_stat_time TEXT,      -- 审判机关采纳从宽处罚建议统计时间
    
    -- 法律文书
    prosecution_transfer_opinion TEXT,        -- 纪检监察机关移送检察机关起诉意见书
    
    -- 调查措施使用次数
    freeze_measure_count INTEGER,             -- 冻结措施使用次数
    search_measure_count INTEGER,             -- 搜查措施使用次数
    seizure_measure_count INTEGER,            -- 查封使用次数
    control_measure_count INTEGER,            -- 扣押使用次数
    tech_investigation_count INTEGER,         -- 技术调查使用次数
    wanted_count INTEGER,                     -- 通缉使用次数
    exit_restriction_count INTEGER,           -- 限制出境使用次数
    
    -- 措施使用情况
    freeze_measure_situation TEXT,            -- 冻结措施使用情况
    search_measure_situation TEXT,            -- 搜查措施使用情况
    seizure_measure_situation TEXT,           -- 查封措施使用情况
    control_measure_situation TEXT,           -- 扣押措施使用情况
    tech_investigation_situation TEXT,        -- 技术调查措施使用情况
    wanted_measure_situation TEXT,            -- 通缉措施使用情况
    exit_restriction_situation TEXT,          -- 限制出境措施使用情况
    
    -- 统计时间
    measure_usage_stat_time TEXT,             -- 使用措施统计时间
    remarks_stat_time TEXT,                   -- 备注统计时间
    
    -- 纪检监察建议（最多8条）
    suggesting_agency1 TEXT,                  -- 提出建议的纪检监察机构名称1
    suggested_unit1 TEXT,                     -- 被建议的单位（组织）名称1
    suggestion_type1 TEXT,                    -- 建议类型1
    suggestion_content1 TEXT,                 -- 建议文书内容1
    suggestion_time1 TEXT,                    -- 提出建议时间1
    suggestion_stat_time1 TEXT,               -- 提出建议统计时间1
    
    suggesting_agency2 TEXT,
    suggested_unit2 TEXT,
    suggestion_type2 TEXT,
    suggestion_content2 TEXT,
    suggestion_time2 TEXT,
    suggestion_stat_time2 TEXT,
    
    suggesting_agency3 TEXT,
    suggested_unit3 TEXT,
    suggestion_type3 TEXT,
    suggestion_content3 TEXT,
    suggestion_time3 TEXT,
    suggestion_stat_time3 TEXT,
    
    suggesting_agency4 TEXT,
    suggested_unit4 TEXT,
    suggestion_type4 TEXT,
    suggestion_content4 TEXT,
    suggestion_time4 TEXT,
    suggestion_stat_time4 TEXT,
    
    suggesting_agency5 TEXT,
    suggested_unit5 TEXT,
    suggestion_type5 TEXT,
    suggestion_content5 TEXT,
    suggestion_time5 TEXT,
    suggestion_stat_time5 TEXT,
    
    suggesting_agency6 TEXT,
    suggested_unit6 TEXT,
    suggestion_type6 TEXT,
    suggestion_content6 TEXT,
    suggestion_time6 TEXT,
    suggestion_stat_time6 TEXT,
    
    suggesting_agency7 TEXT,
    suggested_unit7 TEXT,
    suggestion_type7 TEXT,
    suggestion_content7 TEXT,
    suggestion_time7 TEXT,
    suggestion_stat_time7 TEXT,
    
    suggesting_agency8 TEXT,
    suggested_unit8 TEXT,
    suggestion_type8 TEXT,
    suggestion_content8 TEXT,
    suggestion_time8 TEXT,
    suggestion_stat_time8 TEXT,
    
    -- 涉外信息
    foreign_related_category TEXT,            -- 涉外类别
    involved_country TEXT,                    -- 涉及国家（地区）
    foreign_related_stat_time TEXT,           -- 涉外统计时间
    foreign_related_summary TEXT,             -- 涉外信息摘要
    
    -- 其他信息
    unrecovered_overseas_assets TEXT,         -- 尚未追回的境外涉案财物
    is_self_handled_case TEXT,                -- 纪检监察机关自办案件
    is_public_security_transferred_case TEXT, -- 公检法等机关移送的非职务违法犯罪等案件
    public_security_transferred_detail TEXT,  -- 公检法等机关移送的非职务违法犯罪等案件二级分类
    detention_object_identity TEXT,           -- 留置对象身份
    corruption_bribery_time TEXT,             -- 贪污贿赂行为发生时间
    corruption_bribery_first_year TEXT,       -- 贪污贿赂行为的首次年份

    -- 1. 党风廉政意见回复情况
    duty_ethics_reply_time TEXT,               -- 党风廉政意见回复时间
    duty_ethics_reply_type TEXT,               -- 党风廉政意见回复类型
    duty_ethics_reply_person_count TEXT,    -- 党风廉政意见回复涉及人次
    duty_ethics_reply_materials TEXT,          -- 党风廉政意见回复材料

    -- 2. 不如实报告个人有关事项受处理情况
    false_report_handle_time TEXT,             -- 不如实报告处理时间
    false_report_issue TEXT,                   -- 不如实报告问题
    false_report_disposal TEXT,                -- 不如实报告处理情况
    false_report_punishment_no TEXT,           -- 不如实报告处分文号
    false_report_remarks TEXT,                 -- 不如实报告备注

    -- 3. 其他反映廉政情况的材料
    other_integrity_material_time TEXT,        -- 其他廉政材料时间
    other_integrity_material_name TEXT,        -- 其他廉政材料名称
    other_integrity_material_content TEXT,     -- 其他廉政材料内容
    other_integrity_material_department TEXT,  -- 其他廉政材料形成部门
    other_integrity_material_remarks TEXT,      -- 其他廉政材料备注

    -- 系统字段
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    created_by TEXT,
    updated_by TEXT
  )
`);

    // 不如实报告个人有关事项受处理情况表
  db.exec(`
    CREATE TABLE IF NOT EXISTS personal_matters_report_punishment (
      id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
    
      -- 基本信息
      time_period TEXT,                          -- 时间
      problem_description TEXT,                  -- 问题
      handling_situation TEXT,                   -- 处理情况
      punishment_document_number TEXT,           -- 处分文号
      remarks TEXT,                              -- 备注
    
      -- 系统字段
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      created_by TEXT,
      updated_by TEXT
    )
  `);

  // 党风廉政意见回复情况表
  db.exec(`
    CREATE TABLE IF NOT EXISTS party_conduct_opinion_reply (
      id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
    
      -- 基本信息
      time_period TEXT,                          -- 时间
      type TEXT,                                 -- 类型
      person_count INTEGER,                      -- 人次
      reply_document TEXT,                       -- 回复材料
    
      -- 系统字段
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      created_by TEXT,
      updated_by TEXT
    )
  `);

  // 其他反映廉政情况的材料表
  db.exec(`
    CREATE TABLE IF NOT EXISTS other_clean_government_materials (
      id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
    
      -- 基本信息
      time_period TEXT,                          -- 时间
      material_name TEXT,                        -- 材料名称
      material_content TEXT,                     -- 材料内容
      material_forming_department TEXT,          -- 材料形成部门
      remarks TEXT,                              -- 备注

      -- 系统字段
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      created_by TEXT,
      updated_by TEXT
    )
  `);

    // 导出日志表
  db.exec(`
    CREATE TABLE IF NOT EXISTS delieve_log (
      id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),
      group_name TEXT,     --分组名                    
      time_range TEXT,     -- 时间范围                           
      file_name TEXT,      -- 文件名               
      export_path TEXT,    -- 导出路径                   
    
      -- 系统字段
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,  -- 操作时间
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      created_by TEXT,
      updated_by TEXT
    )
  `);

      // 导入日志表
  db.exec(`
    CREATE TABLE IF NOT EXISTS receive_log (
      id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))),                        
      file_name TEXT,      -- 文件名               
      success_number TEXT,    -- 成功数量                  
      skip_number TEXT,    -- 跳过数量                  
      update_number TEXT,    -- 更新数量                  
      fail_reason TEXT,    -- 失败原因                  
    
      -- 系统字段
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,  -- 操作时间
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      created_by TEXT,
      updated_by TEXT
    )
  `);
   

    db.close();
    console.log('数据库初始化完成');
  }

  // 验证数据库连接
  async verifyDatabase(dbKey) {
    try {
      const Database = require('better-sqlite3');
      const options = dbKey ? { key: dbKey } : {};
      console.log('数据库连接选项:', Object.keys(options));
      
      const db = new Database(this.dbPath, options);
      const result = db.prepare('SELECT 1 as test').get();
      db.close();
      
      console.log('数据库验证成功');
      return result.test === 1;
    } catch (error) {
      console.error('数据库验证失败:', error.message);
      throw new Error('数据库验证失败: ' + error.message);
    }
  }

  // 通过会话ID获取数据库密钥
  async getDbKeyBySession(sessionId) {
    if (!sessionId) {
      throw new Error('无效的会话ID');
    }

    const session = this.sessions.get(sessionId);
    if (!session) {
      throw new Error('会话不存在或已过期');
    }

    if (Date.now() > session.expiry) {
      this.sessions.delete(sessionId);
      this.userSessions.delete(session.username);
      throw new Error('会话已过期，请重新登录');
    }

    // 更新过期时间
    session.expiry = Date.now() + (24 * 60 * 60 * 1000);
    
    return session.dbKey;
  }

  // 验证会话
  async verifySession(sessionId) {
    try {
      if (!sessionId) {
        return { 
          isAuthenticated: false, 
          reason: '无效的会话ID' 
        };
      }

      const dbKey = await this.getDbKeyBySession(sessionId);
      const session = this.sessions.get(sessionId);
      
      return {
        isAuthenticated: true,
        username: session.username,
        loginTime: session.loginTime,
        expiresAt: new Date(session.expiry).toISOString()
      };
    } catch (error) {
      return {
        isAuthenticated: false,
        reason: error.message
      };
    }
  }

  // 退出登录
  async logout(sessionId) {
    try {
      if (sessionId) {
        const session = this.sessions.get(sessionId);
        if (session) {
          this.userSessions.delete(session.username);
        }
        this.sessions.delete(sessionId);
      }
      
      return { success: true, message: '已安全退出' };
    } catch (error) {
      return { success: false, error: error.message };
    }
  }

  // 获取用户名
  getUsernameFromConfig() {
    if (!fs.existsSync(this.configPath)) {
      return null;
    }
    const config = JSON.parse(fs.readFileSync(this.configPath, 'utf8'));
    return config.username;
  }

  // 清理过期会话
  cleanupExpiredSessions() {
    const now = Date.now();
    let cleanedCount = 0;
    
    for (const [sessionId, session] of this.sessions.entries()) {
      if (now > session.expiry) {
        this.sessions.delete(sessionId);
        this.userSessions.delete(session.username);
        cleanedCount++;
      }
    }
    
    if (cleanedCount > 0) {
      console.log(`清理了 ${cleanedCount} 个过期会话`);
    }
    
    return cleanedCount;
  }

  // 获取会话统计信息
  getSessionStats() {
    this.cleanupExpiredSessions();
    
    return {
      totalSessions: this.sessions.size,
      activeUsers: this.userSessions.size,
      sessions: Array.from(this.sessions.entries()).map(([id, session]) => ({
        sessionId: id.substring(0, 8) + '...',
        username: session.username,
        expiresIn: Math.max(0, session.expiry - Date.now()) / (60 * 1000) // 分钟
      }))
    };
  }
  // 在 auth.js 中添加调试函数
async debugKeyGeneration(username, password) {
  console.log('=== 密钥生成调试 ===');
  console.log('用户名:', username);
  console.log('密码:', password);
  
  // 测试多次生成是否一致
  const key1 = this.generateDbKey(username, password);
  const key2 = this.generateDbKey(username, password);
  const key3 = this.generateDbKey(username, password);
  
  console.log('密钥1:', key1.substring(0, 10) + '...');
  console.log('密钥2:', key2.substring(0, 10) + '...');
  console.log('密钥3:', key3.substring(0, 10) + '...');
  console.log('一致性检查:');
  console.log('key1 === key2:', key1 === key2);
  console.log('key1 === key3:', key1 === key3);
  console.log('key2 === key3:', key2 === key3);
  console.log('=== 调试结束 ===');
}
}

module.exports = MemoryAuthManager;